package com.jerem.gwt.bredgolf.server;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Query;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.jerem.gwt.bredgolf.client.GolfClub;
import com.jerem.gwt.bredgolf.client.GolfParcours;
import com.jerem.gwt.bredgolf.client.GolfPartie;
import com.jerem.gwt.bredgolf.client.GolfPartieService;
import com.jerem.gwt.bredgolf.client.Joueur;
import com.jerem.gwt.bredgolf.client.Score;

public class GolfPartieImpl extends RemoteServiceServlet implements GolfPartieService {

	private static final Logger LOG = Logger.getLogger(JoueurImpl.class.getName());
	private static final PersistenceManagerFactory PMFInstance = PMF.get();
	
	private PersistenceManager getPersistenceManager() {
	    return PMFInstance.getPersistenceManager();
	}
	
	public void addPartie(GolfPartie partie) {
		PersistenceManager pm = getPersistenceManager();
	    try {
    	  List<Score> listeScore = partie.getListeScore();
          List<ScoreDTO> listeScoreDTO = new ArrayList<ScoreDTO>();
          for (Score score : listeScore) {
        	  ScoreDTO unScoreDTO = new ScoreDTO();
        	  unScoreDTO.setJoueurID(score.getJoueurID());
        	  unScoreDTO.setParcoursID(score.getParcoursID());
        	  unScoreDTO.setIndexJourJ(score.getIndexJourJ());
        	  unScoreDTO.setListePut(score.getListePut());
        	  unScoreDTO.setListeScore(score.getListeScore());
        	  unScoreDTO.setListePut(score.getListeScore());
        	  listeScoreDTO.add(unScoreDTO);
          }
          
          GolfPartieDTO golfPartieDTO = new GolfPartieDTO(partie.getGolfClubID(), 
        		  										  partie.getTypePartie(), 
        		  										  partie.getCommentaire(), 
        		  										  new Date(),
        		  										  listeScoreDTO);
	    	
	      pm.makePersistent(golfPartieDTO);
	      
	      this.envoieMails();
	      
	    } finally {
	      pm.close();
	    }
	}

	private void envoieMails() {
		Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);

        String msgBody = "http://ohmybredgolf.appspot.com/";

        try {
            Message msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress("marsegan@gmail.com", "BredGolf Admin"));
            msg.addRecipient(Message.RecipientType.TO,
                             new InternetAddress("jeremy.marsegan@bred.fr", "Mr. User"));
            msg.addRecipient(Message.RecipientType.TO,
                    new InternetAddress("alexandre.dupont-vernon@bred.fr", "Mr. User"));
            msg.addRecipient(Message.RecipientType.TO,
                    new InternetAddress("alain.truong@bred.fr", "Mr. User"));
            msg.setSubject("!!! Nouvelle partie !!!");
            msg.setText(msgBody);
            Transport.send(msg);

        } catch (Exception e) {
            // ...
        }
	}

	public void deletePartie(GolfPartie partie) {
		// TODO Auto-generated method stub
		
	}

	public List<GolfPartie> getListeParties() {
		List<GolfPartie> results = new ArrayList<GolfPartie>();
		PersistenceManager pm = getPersistenceManager();
	    try {
	      Query q = pm.newQuery(GolfPartieDTO.class);
	      List<GolfPartieDTO> listePartiesDTO = (List<GolfPartieDTO>) q.execute();
	      for (GolfPartieDTO partieDTO : listePartiesDTO) {
	    	  GolfPartie unePartie = new GolfPartie();
	    	  unePartie.setId(partieDTO.getId().getId());
	    	  unePartie.setGolfClubID(partieDTO.getGolfClubID());
	    	  unePartie.setGolfClub(this.getGolfClub(partieDTO.getGolfClubID()));
	    	  unePartie.setCreateDate(partieDTO.getCreateDate());
	    	  unePartie.setTypePartie(partieDTO.getTypePartie());
	    	  unePartie.setCommentaire(partieDTO.getCommentaire());
	          List<ScoreDTO> listeScoreDTO = partieDTO.getListeScore();
	          List<Score> listeScores = new ArrayList<Score>();
	          for (ScoreDTO unScoreDTO : listeScoreDTO) {
	        	  Score unScore = new Score();
	        	  unScore.setId(unScoreDTO.getId().getId());
	        	  unScore.setJoueurID(unScoreDTO.getJoueurID());
	        	  unScore.setJoueur(this.getJoueur(unScoreDTO.getJoueurID()));
	        	  unScore.setParcoursID(unScoreDTO.getParcoursID());
	        	  for (GolfParcours unParcours : unePartie.getGolfClub().getListeParcours()) {
	        		  if (unParcours.getId() == unScoreDTO.getParcoursID()) {
	        			  unScore.setParcours(unParcours);
	        		  }
	        	  }
	        	  unScore.setIndexJourJ(unScoreDTO.getIndexJourJ());
	        	  unScore.setListePut(unScoreDTO.getListePut());
	        	  unScore.setListeScore(unScoreDTO.getListeScore());
	        	  listeScores.add(unScore);
	          }
	          unePartie.setListeScore(listeScores);
	          results.add(unePartie);
	      }
	    } finally {
	      pm.close();
	    }
	    return results;
	}

	private Joueur getJoueur(Long joueurID) {
		Joueur unJoueur = new Joueur();
		Key k = KeyFactory.createKey(JoueurDTO.class.getSimpleName(), joueurID);
		PersistenceManager pm = getPersistenceManager();
	    try {
	      JoueurDTO joueurDTO = pm.getObjectById(JoueurDTO.class, k);
	      unJoueur.setId(joueurDTO.getId().getId());
    	  unJoueur.setNom(joueurDTO.getNom());
    	  unJoueur.setPrenom(joueurDTO.getPrenom());
    	  unJoueur.setEmail(joueurDTO.getEmail());
    	  unJoueur.setIndexAmical(joueurDTO.getIndexAmical());
    	  unJoueur.setIndexCompet(joueurDTO.getIndexCompet());
	    } finally {
	      pm.close();
	    }
	    return unJoueur;
	}

	private GolfClub getGolfClub(Long golfClubID) {
		GolfClub unClub = new GolfClub();
		Key k = KeyFactory.createKey(GolfClubDTO.class.getSimpleName(), golfClubID);
		PersistenceManager pm = getPersistenceManager();
	    try {
	      GolfClubDTO clubDTO = pm.getObjectById(GolfClubDTO.class, k);
    	  unClub.setId(clubDTO.getId().getId());
          unClub.setNom(clubDTO.getNom());
          unClub.setAdresse(clubDTO.getAdresse());
          unClub.setTel(clubDTO.getTel());
          unClub.setLattitude(clubDTO.getLattitude());
          unClub.setLongitude(clubDTO.getLongitude());
          List<GolfParcoursDTO> listeParcoursDTO = clubDTO.getListeParcours();
          List<GolfParcours> listeParcours = new ArrayList<GolfParcours>();
          for (GolfParcoursDTO parcoursDTO : listeParcoursDTO) {
        	  GolfParcours unParcours = new GolfParcours();
        	  unParcours.setId(parcoursDTO.getId().getId());
        	  unParcours.setCouleur(parcoursDTO.getCouleur());
        	  unParcours.setSlope(parcoursDTO.getSlope());
        	  unParcours.setSSS(parcoursDTO.getSSS());
        	  unParcours.setTabDistance(parcoursDTO.getTabDistance());
        	  unParcours.setTabHcp(parcoursDTO.getTabHcp());
        	  unParcours.setTabPar(parcoursDTO.getTabPar());
        	  listeParcours.add(unParcours);
          }
          unClub.setListeParcours(listeParcours);
	    } finally {
	      pm.close();
	    }
	    return unClub;
	}

}
